#include "stm32f10x.h"                  // Device header
void PWM_Init(void){
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);  //开启APB1的时钟函数，TIM2在APB1总线中
	//选择时基单元
	TIM_InternalClockConfig(TIM2);//系统默认是内部时钟，不写也可以
	//配置时基单元
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; //给输入的滤波器一个采样频率
	TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//计数方式
	
	TIM_TimeBaseInitStructure.TIM_Period=100-1;//ARR自动重装器的值
	TIM_TimeBaseInitStructure.TIM_Prescaler=720-1;//PSC预分配器的值
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;//重复计数器的值，我们用的通用寄存器，所以直接写0就好了
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
	TIM_ClearFlag(TIM2,TIM_IT_Update);
	//初始化输出比较单元：频率1kHz，占空比为50%的PWM波形
	//TIM_OCInitStructure函数有一部分是高级定时器里的，要么就把全部成员拉出来配置，要么就用TIM_OCStructInit先赋一个初始值0
	TIM_OCInitTypeDef TIM_OCInitStructure;
	TIM_OCStructInit(&TIM_OCInitStructure);
	TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;//8种输出比较模式
	TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//输出比较极性
	TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//输出使能
	
	//因此通过观察得知，我们需要完成的呼吸灯的变化效果就与CCR的值息息相关，TIM_SetCompare1单独更改CCR值的函数就有用了
	TIM_OCInitStructure.TIM_Pulse=0;//就是CCR的值
	
	TIM_OC1Init(TIM2, &TIM_OCInitStructure);
	//现在把TIM2上的OC1通道上就可以输出PWM波形，这个波形是需要借助GPIO口才能输出，邮引脚定义表得知我们锁定在PA0引脚上
	/*开启时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);		//开启GPIOA的时钟
	/*GPIO初始化*/
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出，因为普通的推挽输出，引脚的控制权是来自于输出数据寄存器的，那我们这时想让的是定时器来控制引脚，则需要使用复用推挽输出
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);						
	
	//启动定时器
	TIM_Cmd(TIM2, ENABLE);
}
void PWM_set(uint16_t compare){
	TIM_SetCompare1(TIM2,compare);
}

//单独修改PSC
void PWM_SetPSC(uint16_t PSC){
	TIM_PrescalerConfig(TIM2, PSC, TIM_PSCReloadMode_Immediate);
}